package com.navinfo.platform.trip.common.pojo;

import com.navinfo.platform.trip.common.enums.ProtocolEnum;

import java.io.Serializable;
import java.util.Comparator;

/**
 * 位置点的公共信息，所有车厂公用一份
 * @author web
 **/
public interface Point extends Serializable {
    /**
     * 车辆tid(公共)
     */
    long getTid();
    /**
     * 读取离线公共轨迹时使用<br/>
     * 行程id(公共)
     */
    int getTripId();
    /**
     * 获取协议类型(公共)<br/>
     * 1：密集<br/>
     * 2：位置<br/>
     */
    ProtocolEnum getProtocol();

    /**
     * gps时间，单位ms （公共）
     */
    long getGpsTime();
    /**
     * 速度,单位km/h (公共)
     */
    double getSpeedKmh();

    /**
     * 原始纬度（84坐标系） ，单位：以度为单位乘以10的6次方(公共)
     */
    int getOriginalLat();
    /**
     * 原始经度（84坐标系） ，单位：以度为单位乘以10的6次方(公共)
     */
    int getOriginalLng();
    /**
     * 纬度（02坐标系） ，单位：以度为单位乘以10的6次方(公共)
     */
    int getLatitude();
    /**
     * 经度（02坐标系） ，单位：以度为单位乘以10的6次方(公共)
     */
    int getLongitude();

    /**
     * 方向0-359正北为0顺时针(公共)
     */
    int getDirection();
    /**
     * 高程，海拔高度，单位为米（m）（有符号数）单位米 (公共)
     */
    double getHeight();
    /**
     * 转速，单位：rpm（转每分钟）(公共)
     */
    int getRotation();
    /**
     * 油门，单位：%(公共)
     */
    int getAccPedalPos();
    /**
     * 离合器开关(公共)
     */
    int getClutchSwitch();
    /**
     * 发动机输出扭矩，单位：%(公共)
     */
    int getEngineOutputTorque();
    /**
     * 发动机瞬时油耗，单位：km/L(公共)
     */
    double getRealTimeOilConsumption();
    /**
     * 发动机燃油消耗率,单位：L/h(公共)
     */
    double getFuelConsumptionRate();
    /**
     *  制动信号状态，0关，1开（0F37特有，0200为0）
     */
    int getBrake();
    /**
     * 流水号(0200特有，0f37为0)
     */
    int getSerialNumber();

    /**
     * 排序规则：
     * 1、按gps时间，时间大的放前；
     * 2、按协议，0200放前；
     * 3、按流水号排序，大的放前；
     * 4、按转速排序，大的放前；
     */
    Comparator<Point> COMPARATOR = (o1, o2) -> {
        int r = 0;
        if (o1 != null && o2 != null) {
            //根据gpsTime排序
            if (o1.getGpsTime() > o2.getGpsTime()) {
                r = 1;
            } else if (o1.getGpsTime() < o2.getGpsTime()) {
                r = -1;
            }else{
                //根据协议排序，将0200放天0f37前面
                int t1 = ProtocolEnum.LOCATION.equals(o1.getProtocol()) ? 0 : 1;
                int t2 = ProtocolEnum.LOCATION.equals(o2.getProtocol()) ? 0 : 1;
                r = t1 - t2;

                //最后根据流水号排序(相同协议)  r==0 <=> t1==t2
                if (r == 0) {
                    int serial1 = o1.getSerialNumber();
                    int serial2 = o2.getSerialNumber();
                    if (serial1 > serial2) {
                        r = 1;
                    } else if (serial1 < serial2) {
                        r = -1;
                    }else{
                        //最后按转速排序，0f37流水号都为0
                        r = o1.getRotation() - o2.getRotation();
                    }
                }
            }
        }
        return r;
    };

}
